3.7.1 第三方依赖
像godep和vender这种社区工具已经使用 第三方 (verdoring)导入路径重写这种特性解决了依赖问题。其思想是把所有的依赖包复制到工程代码库中的目录里,然后使用工程内部的依赖包所在目录来重写所有的导入路径。
代码清单3-9展示的是使用godep来管理工程里第三方依赖时的一个典型的源代码树。
代码清单3-9 使用godep的工程
$GOPATH/src/github.com/ardanstudios/myproject
|-- Godeps
| |-- Godeps.json
| |-- Readme
| |-- _workspace
| |-- src
| |-- bitbucket.org
| |-- ww
| | |-- goautoneg
| | |-- Makefile
| | |-- README.txt
| | |-- autoneg.go
| | |-- autoneg_test.go
| |-- github.com
| |-- beorn7
| |-- perks
| |-- README.md
| |-- quantile
| |-- bench_test.go
| |-- example_test.go
| |-- exampledata.txt
| |-- stream.go
|
|-- examples
|-- model
|-- README.md
|-- main.go
可以看到 godep
创建了一个叫作 Godeps
的目录。由这个工具管理的依赖的源代码被放在一个叫作 _workspace/src
的目录里。
接下来,如果看一下在main.go里声明这些依赖的 import
语句(如代码清单3-10和代码清单3-11所示),就能发现需要改动的地方。
代码清单3-10 在路径重写之前
01 package main
02
03 import (
04 "bitbucket.org/ww/goautoneg"
05 "github.com/beorn7/perks"
06 )
代码清单3-11 在路径重写之后
01 package main
02
03 import (
04 "github.ardanstudios.com/myproject/Godeps/_workspace/src/
bitbucket.org/ww/goautoneg"
05 "github.ardanstudios.com/myproject/Godeps/_workspace/src/
github.com/beorn7/perks"
06 )
在路径重写之前, import
语句使用的是包的正常路径。包对应的代码存放在 GOPATH
所指定的磁盘目录里。在依赖管理之后,导入路径需要重写成工程内部依赖包的路径。可以看到这些导入路径非常长,不易于使用。
引入依赖管理将所有构建时依赖的源代码都导入到一个单独的工程代码库里,可以更容易地重新构建工程。使用导入路径重写管理依赖包的另外一个好处是这个工程依旧支持通过 go get
获取代码库。当获取这个工程的代码库时, go get
可以找到每个包,并将其保存到工程里正确的目录中。